/**
 * 需配置tsconfig："experimentalDecorators": true, 
 * @ClassDecorator 装饰器(Decorator)是一种特殊的类型声明，可以附加在
 * 类、方法、属性、参数上，装饰器是一个函数 
 */
const doc:ClassDecorator = (target:any) => {
       target.prototype.name = 'newking'
}  
/**
 *  @doc相当于doc(Xiaohong)  @用来接受一个装饰器
 *  让装饰器帮忙设置 Xiaohong 的属性，就不用去干扰 Xiaohong 这个类
 */
@doc class Xiaohong{}
// const xh:any = new Xiaohong();
// console.log(xh.name);


/**
 * 上面是类装饰器，接下来了解下属性装饰器和方法装饰器
 * 此时的target就不是Class，而是原型对象
 * key返回名称
 */
const doc_p: PropertyDecorator = (target:any,key:string | symbol) => {
       console.log('属性装饰器返回:',target,key)
}
/**
 * 方法装饰器，12参数同上，参数3返回一个描述对象
 * 参数3：descriptor.value 就是@doc_f 后面这个函数对象
 */

const doc_f: MethodDecorator = (target:any,key:string | symbol,descriptor:any) => {
       console.log('方法装饰器返回:',target,key,descriptor)
}
//参数装饰器 参数3：index表示参数所在位置[索引]
const doc_param:ParameterDecorator= (target:any,key:string | symbol,index:any) => {
       console.log('参数装饰器返回:',target,key,index)
}

class P{
  
     @doc_p
     public name:string
     
     constructor(){this.name = 'newking'}
     
     @doc_f getName(name:string,@doc_param age:number){
       console.log(this.name,name,age);
     }
     
}
